//Ta Duc Viet
//Phan tich 1 tich ra cac uoc nguyen to
#include <iostream>
#include <cmath>
using namespace std;

struct NT{
	int co_so;
	int so_mu;
};

bool Nguyen_To ( int a);//a: so can kiem tra Nguyen To
int So_Uoc_Nguyen_To ( int n , int mang[], int so_uoc);
// Phan tich n thanh cac so nguyen to dua vao mang, so_uoc chi so luong da co trong mang
// Tra ve so luong so NT khi phan tich n
int Uoc ( int n);// tra gia tri uoc cua n
void Uoc_Nguyen_To ( int mang[],  int so_uoc, NT uoc[]);
//mang: Mang chua cac thua so nguyen to;
//so_uoc: So cac thua so nguyen to trong mang
//Ham gop cac thua so nguyen to thanh kieu NT vao mang uoc[]
void sort_arr ( int mang[], int so_uoc);
// Sap xep mang[] theo chieu giam dan

int main(){
	int n[40], count, mang_uoc[40], so_uoc, tich;
	NT uoc[40];
	for (int i = 0; i < 40; i++){
		uoc[i].co_so = 0;
		uoc[i].so_mu = 0;
	}
	cin >> count;
	if ( count <= 0) return 0;
	for ( int i = 0; i < count; i++){
		cin >> n[i];
	}
	tich = 1;
	for ( int i = 0; i < count; i++){
		tich = tich * n[i];
	}
	if ( tich == 0){
		cout << "0" << endl;
		system("pause");
		return 0;
	}
	so_uoc = 0;
	for ( int i = 0; i < count; i++){
		so_uoc = so_uoc + So_Uoc_Nguyen_To ( n[i], mang_uoc, so_uoc); 
	}
	Uoc_Nguyen_To (mang_uoc, so_uoc, uoc);
	if ( tich < 0) cout << "- ";
	cout << uoc[0].co_so;
	if ( uoc[0].so_mu != 1) cout << "^" << uoc[0].so_mu;
	for ( int i = 1; uoc[i].co_so != 0; i++){
		cout << "*" << uoc[i].co_so; 
		if ( uoc[i].so_mu > 1) cout << "^" << uoc[i].so_mu;
	}
	cout << endl;
	system("pause");
	return 0;
}
bool Nguyen_To ( int a){
	if ( a == 1) return true;
	else{
		for ( int i = 2; i < sqrt(float(a) + 1) ; i ++){
			if ( a % i == 0 ) return false;
		}
		return true;
	}
}
int Uoc ( int tich){
	for ( int i = 2; i < sqrt (float (tich) + 1); i++){
		if ( int(tich) % i == 0) return i;
	}
}
int So_Uoc_Nguyen_To ( int tich, int mang_uoc[], int so_uoc){
	int i = so_uoc;
	tich = abs(tich);
	while ( Nguyen_To (tich) == false ){
		mang_uoc[i] = Uoc ( tich);
		i++;
		tich = tich / Uoc(tich);
	}
	mang_uoc[i] = tich;
	return i  - so_uoc + 1;
}
void Uoc_Nguyen_To ( int mang_uoc[], int so_uoc, NT uoc[]){
	sort_arr(mang_uoc, so_uoc);
	uoc[0].co_so = mang_uoc[0];
	uoc[0].so_mu = 1;
	int j = 0;
	for ( int i = 1; i < so_uoc; i++){
		if (mang_uoc[i] == uoc[j].co_so) uoc[j].so_mu++;
		else{
			j++;
			uoc[j].co_so = mang_uoc[i];
			uoc[j].so_mu = 1;
		}
	}
}
void sort_arr ( int mang_uoc[], int so_uoc){
	int min, t;
	for ( int i = 0; i < so_uoc - 1; i++){
		min = mang_uoc[i];
		t = i;
		for ( int j = i + 1; j < so_uoc; j++) 
			if (mang_uoc[j] < min){
				min = mang_uoc[j];
				t = j;
			}
		int temp;
		temp = mang_uoc[i];
		mang_uoc[i] = mang_uoc[t];
		mang_uoc[t] = temp;
	}
}